package com.payment.paymentmanagersystem.idal;

import com.payment.paymentmanagersystem.model.PayInfo;
import com.payment.paymentmanagersystem.model.UserInfo;
import com.payment.paymentmanagersystem.unit.Pager;

import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.StatementType;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 用户相关功能接口
 * @author 李耀华
 * @date 2023年6月14日
 */

@Mapper
@Component
public interface IUserDAL {
    /**
     * 用户账号注册
     * @param: 登录用户名，密码，注册邮箱（用于激活）
     */
    @Insert("Insert into zf_usertb(user_loginname,user_loginpass,user_email,user_truename,alive_code)value(#{user_loginname},#{user_loginpass},#{user_email},#{user_loginname},#{alive_code})")
    public Integer RegisterUser(UserInfo user);

    /**
     * 注册用户前验证用户名是否已经存在
     *
     */
    @Select("select count(*) from zf_usertb where user_loginname=#{user_loginname}")
    public Integer isLoginNameExits(UserInfo user);

    /**
     * 注册用户前验证邮箱是否已经存在
     *
     */
    @Select("select count(*) from zf_usertb where user_email=#{user_email}")
    public Integer isEmailExits(UserInfo user);

    /**
     * 用户账号注册时邮件激活方法
     * 向用户发送激活链接，关键字是激活链接上的随机字符串进行验证
     * 激活后 @param isAlive = 1
     */
    @Update("update zf_usertb set isAlive = 1 where alive_code=#{alive_code}")
    public Integer activeEmail(UserInfo user);

    /**
     * 用户账户登录
     * 支持多种方式
     * 可以使用邮箱或者登录用户名登录
     */
    @Select("select user_id,user_loginname,user_email from zf_usertb where user_loginname=#{user_loginname} and user_loginpass=#{user_loginpass} or" +
            " user_email=#{user_email} and isAlive=1 and isBlock=0")
    public UserInfo validateUser(UserInfo user);

    /**
     * 用户账号信息修改
     */
    @Update("update zf_usertb set user_truename=#{user_truename},user_sex=#{user_sex},user_age=#{user_age}," +
            "user_brith=#{user_brith},user_code=#{user_code},user_mobile=#{user_mobile}")
    public Integer EditUser(UserInfo user);

    /**
     * 用户账户冻结
     * 修改 @param isBlock = 1 冻结
     */
    @Update("update zf_usertb set isBlock=#{isBlock} where user_id=#{user_id}")
    public Integer blockUser(UserInfo user);

    /**
     * 修改账号密码前
     * 先进行密码校验
     * 再修改密码
     */
    @Update("update zf_usertb set user_loginpass=#{user_loginnewpass} where user_id=#{user_id}")
    public Integer EditUserPass(UserInfo user);

    /**
     * 用户查询自己个人信息
     */
    @Select("select * from zf_usertb where user_id=#{user_id}")
    public UserInfo getUserInfoByUserID(UserInfo user);

    /**
     * 管理用户
     * 用户分页信息
     * 参数1：startIndex
     * 参数2:pageSize
     */
    @Select("select * from zf_usertb order by user_id desc limit #{startIndex},#{pageSize}")
    public List<UserInfo> getAllUsersByPager(Pager pager);

    /**
     * 管理用户
     * 用户分页页面计算所需数据行数
     */
    @Select("select count(*) from zf_usertb")
    public Integer getAllUsersCounts();

    /**
     * 验证收款用户的合法性
     * 检测是否存在、是否激活、是否禁用
     */
    @Select("select user_id,user_loginname,user_truename from zf_usertb where user_id=#{user_id} and isAlive=1 and isBlock=0")
    public UserInfo validatePayeeUser(UserInfo user);

    /**
     * 查询个人账户余额
     *
     */
    @Select("select blance from zf_usertb where user_id =#{user_id}")
    public UserInfo getBlanceByUserId(UserInfo user);

    /**
     * 查询用户支付信息
     *  语句太多，这里放到存储过程里
     */
    @Select("CALL zf_getPayInfo(#{user_id})")
    @Options(statementType = StatementType.CALLABLE)
    public List<PayInfo> getPayInfoListByUserId(UserInfo user);
}
